class HasPtr {
public:
	HasPtr(const std::string& s = std::string()) : ps(new std::string(s)), i(0), use(new size_t(1)) { }   //初始化时，对象的引用计数为1
	HasPtr(const HasPtr& hp) : ps(hp.ps), i(hp.i), use(hp.use) { ++* use; }
	HasPtr& operator=(const HasPtr& rhs) {
		++* rhs.use;
		if (-- * use == 0) {   ///这里对左边的指针减一进行判断   最终左边的引用计数由右边的rhs赋予   
			delete ps;			////  不管如何  都对右边计数先加1  假设是同一个变量 就一定不会跑到if 中去    相反 如果不是同一个变量 左边的引用计数为1时会跑进去 
			delete use;   ///delete掉的指针变量是可以再赋值  delete的实质应该是将指向的内存返回给操作系统
		}
		ps = rhs.ps;
		i = rhs.i;
		use = rhs.use;
		return *this;
	}
	~HasPtr() {
		if (-- * use == 0) {
			delete ps;
			delete use;
		}
	}
private:
	std::string* ps;
	int i;
	size_t* use;
};

int main()

{
	HasPtr a;
//	a = a;       //如果是自赋值 ，不会进if语句 ，use的引用计数最终会不变
	HasPtr b;
	b = a;   //正常赋值 use的引用计数加1   b.use和a.use指向同一对象
	HasPtr c1;
	c1 = b;
	c1 = c1;
}